package org.jeecg.modules.rental.service.impl;


import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.common.rental.vo.LoginRentalAccount;
import org.jeecg.modules.rental.entity.RentalAccount;
import org.jeecg.modules.rental.entity.RentalCouponConfig;
import org.jeecg.modules.rental.entity.RentalCouponOrder;
import org.jeecg.modules.rental.entity.RentalCouponOrderDetail;
import org.jeecg.modules.rental.mapper.RentalAccountMapper;
import org.jeecg.modules.rental.mapper.RentalCouponConfigMapper;
import org.jeecg.modules.rental.mapper.RentalCouponOrderDetailMapper;
import org.jeecg.modules.rental.mapper.RentalCouponOrderMapper;
import org.jeecg.modules.rental.service.IRentalCouponOrderDetailService;
import org.jeecg.modules.rental.service.IRentalCouponOrderService;
import org.jeecg.modules.rental.util.OrderSnUtil;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @Description: 卡券订单表
 * @Author: jeecg-boot
 * @Date:   2024-08-20
 * @Version: V1.0
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class RentalCouponOrderServiceImpl extends ServiceImpl<RentalCouponOrderMapper, RentalCouponOrder> implements IRentalCouponOrderService {

    private final RentalCouponOrderDetailMapper couponOrderDetailMapper;
    private final RentalCouponConfigMapper rentalCouponConfigMapper;
    private final RentalAccountMapper rentalAccountMapper;
    private final IRentalCouponOrderDetailService couponOrderDetailService;
    private final OrderSnUtil orderSnUtil;

    @Override
    public IPage<RentalCouponOrder> selectJoinPage(Page<RentalCouponOrder> page, Wrapper wrapper) {
        IPage<RentalCouponOrder> pageList = baseMapper.selectJoinPage(page, wrapper);
        if(ObjectUtil.isNotEmpty(pageList) && ObjectUtil.isNotEmpty(pageList.getRecords())){
            List<String> accountIds = pageList.getRecords().stream().map(RentalCouponOrder::getAccountId).collect(Collectors.toList());
            List<RentalAccount> accountList = rentalAccountMapper.selectBatchIds(accountIds);
            pageList.getRecords().stream().forEach(item->{
                Optional<RentalAccount> accountOptional = accountList.stream().filter(a-> a.getId().toString().equals(item.getAccountId())).findFirst();
                accountOptional.ifPresent(a-> item.setAccountName(a.getAccountCode()));
            });
        }
        return pageList;
    }

//    private final RentalAccountCouponMapper rentalAccountCouponMapper;
//
//
//

//    @Override
//    @DataOrgScope(orgField = "sys_org_code")
//    public IPage<RentalCouponOrder> selectJoinPage(Page page, RentalCouponOrder rentalCouponOrder) {
//        return baseMapper.selectJoinPage(page, rentalCouponOrder);
//    }

    @Override
    public RentalCouponOrder buy(RentalCouponOrder couponOrder) {
        //获取卡券配置
        List<Long> couponConfigIds =  couponOrder.getCoupons().stream()
                .map(RentalCouponOrderDetail::getCouponConfigId)
                .collect(Collectors.toList());
        if(ObjectUtil.isEmpty(couponConfigIds)){
            throw new JeecgBootException("rentalcouponorder.service.coupon.order.confirm.select.coupon");
        }
        List<RentalCouponConfig> couponConfigList = rentalCouponConfigMapper.selectBatchIds(couponConfigIds);
        //限制，一个订单只能购买同一个运营区域下的卡券
        Map<String, List<RentalCouponConfig>> listMap = couponConfigList.stream().collect(Collectors.groupingBy(RentalCouponConfig::getSysOrgCode));
        if(ObjectUtil.isEmpty(listMap)){
            throw new JeecgBootException("rentalcouponorder.service.coupon.order.confirm.select.coupon");
        }
        if(listMap.size() > 1){
            throw new JeecgBootException("rentalcouponorder.service.coupon.order.confirm.same.region");
        }
        String sysOrgCode = listMap.keySet().iterator().next();
        Long orderId = IdWorker.getId();
        String orderCode = orderSnUtil.getRentalTradeCode();; // 生成订单编号
        BigDecimal totalAmount = BigDecimal.ZERO; // 初始化总金额
        //获取用户信息
        LoginRentalAccount rentalAccount = (LoginRentalAccount) SecurityUtils.getSubject().getPrincipal();
        // 添加卡券订单明细
        List<RentalCouponOrderDetail> detailList = new ArrayList<>();
        for(int i=0;i<couponConfigList.size();i++){
            RentalCouponConfig item = couponConfigList.get(i);
            RentalCouponOrderDetail coupon = couponOrder.getCoupons().stream()
                    .filter(a-> a.getCouponConfigId().equals(item.getId())).findFirst().orElse(null);
            if(coupon.getNum() > 0){
                RentalCouponOrderDetail orderDetails = new RentalCouponOrderDetail();
                orderDetails.setOrderId(orderId);
                orderDetails.setCouponConfigId(item.getId());
                orderDetails.setConfigName(item.getName());
                orderDetails.setCategoryCode(item.getCategoryCode());
                orderDetails.setColor(item.getColor());
                orderDetails.setMinAmount(item.getMinAmount());
                orderDetails.setPrice(item.getPrice());
                orderDetails.setFaceValue(item.getFaceValue());
                orderDetails.setValidDays(item.getValidDays());
                orderDetails.setNum(coupon.getNum());
                orderDetails.setSysOrgCode(sysOrgCode);
                detailList.add(orderDetails);
                BigDecimal amount = item.getPrice().multiply(BigDecimal.valueOf(coupon.getNum()));
                totalAmount = totalAmount.add(amount);
            }
        }
        couponOrderDetailService.saveOrUpdateBatch(detailList);
        // 返回优惠券订单信息
        // 创建优惠券订单
        RentalCouponOrder entity = new RentalCouponOrder();
        entity.setId(orderId);
        entity.setAccountId(rentalAccount.getId().toString());
        entity.setOrderCode(orderCode);
        entity.setOrderStatus(1); // 订单状态 1-未支付
        entity.setOrderAmount(totalAmount);
        entity.setPayAmount(totalAmount); // 优惠卷订单实付金额与订单金额相同
        entity.setSysOrgCode(sysOrgCode);
        baseMapper.insert(entity);
        return entity;
    }
//
//    @Override
//    @Transactional
//    public Result<RentalCouponOrder> confirm(ConfirmCouponOrderReq req) {
//        //获取卡券配置
//        List<Long> couponConfigIds =  req.getCoupons().stream()
//                .map(ConfirmCouponOrderReq.CouponItem::getCouponConfigId)
//                .collect(Collectors.toList());
//        if(ObjectUtil.isEmpty(couponConfigIds)){
//            throw new JeecgBootException("rentalcouponorder.service.coupon.order.confirm.select.coupon");
//        }
//        List<RentalCouponConfig> couponConfigList = rentalCouponConfigMapper.selectBatchIds(couponConfigIds);
//
//        //限制，一个订单只能购买同一个运营区域下的卡券
//        Map<String, List<RentalCouponConfig>> listMap = couponConfigList.stream().collect(Collectors.groupingBy(RentalCouponConfig::getSysOrgCode));
//        if(ObjectUtil.isEmpty(listMap)){
//            throw new JeecgBootException("rentalcouponorder.service.coupon.order.confirm.select.coupon");
//        }
//        if(listMap.size() > 1){
//            throw new JeecgBootException("rentalcouponorder.service.coupon.order.confirm.same.region");
//        }
//
//        String sysOrgCode = listMap.keySet().iterator().next();
//        Long orderId = IdWorker.getId(); //订单id
//        String orderCode =orderSnUtil.getRentalTradeCode();; // 生成订单编号
//        BigDecimal totalAmount = BigDecimal.ZERO; // 初始化总金额
//        //保存用户卡券信息
//        for (ConfirmCouponOrderReq.CouponItem couponItem : req.getCoupons()) {
//            // 获取优惠券配置 ID 和购买数量
//            Long couponConfigId = couponItem.getCouponConfigId();
//            Integer num = couponItem.getNum();
//
//            // 根据 couponConfigId 查询优惠券配置信息
//            RentalCouponConfig couponConfig = couponConfigList.stream()
//                    .filter(a-> a.getId().equals(couponConfigId)).findFirst().orElse(null);
//            if (couponConfig == null) {
//                return Result.error("rentalcouponorder.service.coupon.order.confirm.not.exist");
//            }
//            // 校验优惠券配置是否有效
//            if (!couponConfig.getStatus().equals("1")) {
//                return Result.error("rentalcouponorder.service.coupon.order.confirm.invalid");
//            }
//            // 计算优惠卷总价
//            BigDecimal couponPrice = couponConfig.getPrice().multiply(BigDecimal.valueOf(num));
//            totalAmount = totalAmount.add(couponPrice);
//
//            // 更新优惠券配置的已发放数量
//            /*if (couponConfig.getSendNum() == null) {
//                couponConfig.setSendNum(num); // 如果是 null，则直接设置为 num
//            } else {
//                couponConfig.setSendNum(couponConfig.getSendNum() + num); // 否则，累加 num
//            }*/
//            //rentalCouponConfigMapper.updateById(couponConfig);
//
//            // 创建用户优惠券记录
//            for (int i = 0; i < num; i++) {
//                RentalAccountCoupon userCoupon = new RentalAccountCoupon();
//                userCoupon.setAccountId(req.getAccountId());
//                userCoupon.setConfigId(couponConfigId);
//                userCoupon.setSysOrgCode(sysOrgCode);
//                userCoupon.setCouponCode(orderSnUtil.getCouponCode(couponConfig.getSysOrgCode(),couponConfig.getCategoryCode()));
//                userCoupon.setCouponCategory(couponConfig.getCategoryCode());
//                userCoupon.setReceiveTime(LocalDateTime.now());
//                userCoupon.setExpiryDate(LocalDate.now().plusDays(couponConfig.getValidDays()));
//                userCoupon.setStatus("0"); // 0-未使用
////                userCoupon.setPayStatus("0"); // 0-未支付
//                userCoupon.setOrderId(orderId);
//                userCoupon.setMinAmount(couponConfig.getMinAmount());
//                userCoupon.setFaceValue(couponConfig.getFaceValue());
//                userCoupon.setConfigName(couponConfig.getName());
//                userCoupon.setCouponColor(couponConfig.getColor());
//                rentalAccountCouponMapper.insert(userCoupon);
//            }
//        }
//
//        // 创建优惠券订单
//        RentalCouponOrder couponOrder = new RentalCouponOrder();
//        couponOrder.setId(orderId);
//        couponOrder.setAccountId(req.getAccountId());
//        couponOrder.setOrderCode(orderCode);
//        couponOrder.setOrderStatus(1); // 订单状态 1-未支付
//        couponOrder.setOrderAmount(totalAmount);
//        couponOrder.setPayAmount(totalAmount); // 优惠卷订单实付金额与订单金额相同
//        couponOrder.setPayTime(null); // 支付时间为空
//        couponOrder.setSysOrgCode(sysOrgCode);
//        baseMapper.insert(couponOrder);
//        // 返回优惠券订单信息
//        return Result.OK(couponOrder);
//    }


    @Override
    public Page<RentalCouponOrder> orderListNew(Page page, RentalCouponOrder rentalCouponOrder) {
        QueryWrapper<RentalCouponOrder> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("account_id", rentalCouponOrder.getAccountId());
        queryWrapper.eq("order_status", "2");
        Page<RentalCouponOrder> pageList = baseMapper.selectPage(page, queryWrapper);
        if (ObjectUtil.isNotEmpty(pageList.getRecords())) {
            List<Long> orderIdList = pageList.getRecords().stream().map(RentalCouponOrder::getId).collect(Collectors.toList());
            List<RentalCouponOrderDetail> couponOrderDetailList = couponOrderDetailMapper
                    .selectList(new QueryWrapper<RentalCouponOrderDetail>().in("order_id", orderIdList));
            pageList.getRecords().stream().forEach(item->{
                Optional<Integer> numOptional = couponOrderDetailList.stream().filter(a-> a.getOrderId().equals(item.getId()))
                        .map(RentalCouponOrderDetail::getNum).reduce((a,b)-> a + b);
                numOptional.ifPresent(a-> item.setCouponNum(a));//卡卷数量
                Optional<BigDecimal> valueOptional = couponOrderDetailList.stream().filter(a-> a.getOrderId().equals(item.getId()))
                        .map(RentalCouponOrderDetail::getFaceValue).reduce(BigDecimal::add);
                valueOptional.ifPresent(a-> item.setCouponFaceValue(a)); //卡券总面值
            });
        }
        return pageList;
    }



//    @Override
//    public Page<RentalCouponResp> orderListAcountCoupon(Page page, RentalCouponOrderReq req) {
//        if (req.getOrderId() == null) {
//            return new Page<>(); // 如果 orderId 为空，返回空分页对象
//        }
//
//        QueryWrapper<RentalAccountCoupon> queryWrapper = new QueryWrapper<>();
//        queryWrapper.eq("order_id", req.getOrderId());
//       /* if (ObjectUtil.isNotEmpty(req.getPayStatus())) {
//            queryWrapper.eq("pay_status", req.getPayStatus());
//        }*/
//        if (ObjectUtil.isNotEmpty(req.getStatus())) {
//            queryWrapper.eq("status", req.getStatus());
//        }
//        // 添加优惠券状态查询条件，例如只查询未使用优惠券
//        // queryWrapper.eq("status", "0");
//
//        // 查询账户优惠券列表
//        Page<RentalAccountCoupon> accountCouponPage = rentalAccountCouponMapper.selectPage(page, queryWrapper);
//
//        // 获取所有优惠券配置 ID
//        List<Long> configIds = accountCouponPage.getRecords().stream()
//                .map(RentalAccountCoupon::getConfigId)
//                .distinct()
//                .collect(Collectors.toList());
//
//        // 批量查询优惠券配置信息，并使用 Map 存储
//        Map<Long, RentalCouponConfig> couponConfigMap = rentalCouponConfigMapper.selectBatchIds(configIds).stream()
//                .collect(Collectors.toMap(RentalCouponConfig::getId, Function.identity()));
//
//        // 创建 RentalCouponResp 列表
//        List<RentalCouponResp> couponRespList = new ArrayList<>();
//
//        // 遍历账户优惠券列表，填充 RentalCouponResp
//        for (RentalAccountCoupon accountCoupon : accountCouponPage.getRecords()) {
//            // 从 Map 中获取对应的优惠券配置
//            RentalCouponConfig couponConfig = couponConfigMap.get(accountCoupon.getConfigId());
//
//            // 处理 couponConfig 为 null 的情况
//            if (couponConfig == null) {
//                log.error("rentalcouponorder.service.coupon.order.confirm.not.exist"); // 注意右括号
//                // 可以选择抛出异常或跳过该记录
//                continue; // 跳过该记录
//            }
//
//            // 创建 RentalCouponResp 对象
//            RentalCouponResp couponResp = new RentalCouponResp();
//
//            // 复制 RentalAccountCoupon 的值
//            BeanUtils.copyProperties(accountCoupon, couponResp);
//
//            // 设置 RentalCouponConfig 的值
////            couponResp.setConfigName(couponConfig.getName());
//            couponResp.setPrice(couponConfig.getPrice());
////            couponResp.setMinAmount(couponConfig.getMinAmount());
////            couponResp.setFaceValue(couponConfig.getFaceValue());
//            couponResp.setValidDays(couponConfig.getValidDays());
//            couponResp.setStartTime(couponConfig.getStartTime());
//            couponResp.setEndTime(couponConfig.getEndTime());
////            couponResp.setColor(couponConfig.getColor());
//            couponResp.setTotalNum(couponConfig.getTotalNum());
//            couponResp.setSendNum(couponConfig.getSendNum());
//
//            // 添加到 RentalCouponResp 列表
//            couponRespList.add(couponResp);
//        }
//
//        // 创建新的 Page<RentalCouponResp> 对象
//        Page<RentalCouponResp> couponRespPage = new Page<>(page.getCurrent(), page.getSize(), accountCouponPage.getTotal());
//        couponRespPage.setRecords(couponRespList);
//
//        return couponRespPage;
//    }


}
